package com.itheima.config;

import com.itheima.adviser.PerformanceAdviser;
import com.itheima.domain.Account;
import com.itheima.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Primary;

import javax.annotation.Resource;
import java.lang.reflect.Proxy;

/**
 * Configuration  标识 该类是一个配置类 用来替代我们的beans.xml的
 *
 * @ComponentScan("com.itheima") 替代了  <context:component-scan base-package="包的名字"></context:component-scan>
 *
 * @PropertySource 替代了 <context:property-placeholder location="外部属性文件"></context:property-placeholder>
 */
@Configuration   //代表当前是配置入口类 ,用来替代spring核心配置xml文件
//@ComponentScan({"com.itheima.service","com.itheima.controller","com.itheima.dao"})
//@ComponentScan({"com.itheima"})
@ComponentScan("com.itheima")    //扫描指定包下的注解
@Import({JDBCConfig.class})  //类注解  用在主要配置类上,用于导入其他配置类(对象)

public class MyConfig {
/**
 * 注解的作用就是 告诉spring 这个方法 就是用来创建一个 AccountService 对象 并且放入到容器中
 * @Bean("起名字") 等同于 <bean id="名字" class="xxx类">
 * @return使用 @Bean 往容器中注入对象的时候
 *      如果方法需要一些参数 你可以直接写的，当spring容器发现你在帮他造对象的时候，你提出了请求需要一些数据或者对象才能帮他造出对象，那么
 *      它就会从自己容器里找出你需要的东西然后交给你，所以你需要啥找它要就行
 */

    @Bean("accountServiceProxy")
    public AccountService craetProxy(@Qualifier("accountService") AccountService ori ) {    //现在参数需要传入一个原来的对象,即委托类对象,这个对象就是AccountServiceImpl对象

        /*程序运行起来的时候，这些代码开始启动，*/
        //其实就是织入的过程  织入就是把新增的业务逻辑和原对象的业务逻辑合并到一块，
        AccountService proxyInstance = (AccountService) Proxy.newProxyInstance(
                MyConfig.class.getClassLoader(),
                new Class[]{AccountService.class},
                new PerformanceAdviser(ori));

        return proxyInstance;

    }





}
